<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div>
        运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象. 一个执行期上下文定义了一个函数执行时的环境.函数每次执行时对应的执行上下文都是独一无二的, 所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁.
        查找变量:从作用域链的顶端依次向下查找.

    </div>

    <div>
        <h3>作用域精解</h3>
        <p>
            [[scope]]:每个JavaScript函数都有一个对象,对象中有些属性我们可以访问,但是有些不可以 这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个. [[scope]]指的就是我们所说的作用域其中存储了运行期上下文的集合
            作用域链: [[scope]]中所存储的执行期上下文对象的集合,这个集合呈现链式链接,我们把这种链式链接叫做作用域.
        </p>
        <div>
            <h3>闭包的好处</h3>
            <p>
                实现共有变量
            </p>
            <p>可以做缓存(存储结构)</p>
            <p>可以实现封装,属性私有化</p>
            <p>模块化开发,防止污染全局变量</p>
        </div>
    </div>
</body>

</html>
<script>
    function a() {
        function b() {
            var b = 234;
        }
        var a = 123;
        b();
    }
    var glob = 100;
    a();


    function a() {
        function b() {
            var bbb = 234;
            console.log(aaa);
        }
        var aaa = 123;
        return b;
    }
    var g = 100;
    var dome = a();
    dome();
    dome();

    function d() {
        let num = 100;

        function g() {
            num++;
            console.log(num);
        }
        return g;
    }
    var dome1 = d();
    dome1();

    function sum() {
        let cun = 0;

        function c() {
            cun++;
            console.log(cun);
        }
        return c;
    }
    let f = sum()
    f()

    /*  
    (function(){}())
    (function(){})()
    立即执行函数 
    针对初始化功能的函数
    只有表达式才能被执行符号执行
    */
    


    let gg = (function (a,b) { 
        console.log(a + b);
          return a * b;
    }(1,3))

    // function s (){} //函数声明
    // let dd = function(){} 函数表达式


    function test() {
        var arr = [];
        for (var i = 0; i < 10; i++) {
            (function (j) {
                arr[j] = function () {
                    console.log(j);
                }
            }(i))

        }
        return arr;
    }
    var myArr = test();
    for(var j= 0; j < 10; j ++){
        myArr[j]();
    }
</script>